-- main_menu.lua
-- 游戏主界面模块 - 带有背景图片的版本

local MainMenu = {}
MainMenu.__index = MainMenu

-- 导入所需模块
local Director = require("Director")
local DrawNode = require("DrawNode")
local Color = require("Color")
local Vec2 = require("Vec2")
local Node = require("Node")
local Size = require("Size")
local Sprite = require("Sprite")  -- 添加Sprite模块用于显示图片

-- 构造函数：创建新的主菜单实例
function MainMenu.new(inputManager, sceneManager)
    local instance = {
        inputManager = inputManager,  -- 输入管理器
        sceneManager = sceneManager,  -- 场景管理器
        rootNode = nil,              -- 根节点
        gameInstance = nil,          -- 游戏实例引用
        backgroundSprite = nil,      -- 背景图片精灵
        startButtonSprite = nil      -- 开始按钮图片精灵
    }
    return setmetatable(instance, MainMenu)
end

-- 设置游戏实例引用
function MainMenu:setGameInstance(game)
    self.gameInstance = game
end

-- 创建主界面
function MainMenu:create()
    -- 创建根节点
    self.rootNode = Node()
    
    -- 创建背景图片
    self:createBackground()
    
    -- 创建按钮
    self:createButtons()
    
    -- 设置输入上下文为UI
    self.inputManager:pushContext("UI")
    
    -- 注册输入回调
    self:registerInputCallbacks()
    
    print("主菜单创建完成")
    
    return self.rootNode
end

-- 创建背景图片
function MainMenu:createBackground()
    -- 尝试加载背景图片
    local success, errorMsg = pcall(function()
        -- 加载Image文件夹下的main.jpg文件
        self.backgroundSprite = Sprite("Image/main.jpg")
        
        -- 设置背景位置（通常是屏幕中心）
        self.backgroundSprite.position = Vec2(0, 0)
        
        -- 设置层级，确保背景在最底层
        self.backgroundSprite.zOrder = -100
        
        -- 添加到根节点
        self.rootNode:addChild(self.backgroundSprite)
        
        print("背景图片加载成功")
    end)
    
    if not success then
        print("警告：背景图片加载失败 - " .. tostring(errorMsg))
        -- 加载失败时创建一个纯色背景作为回退
        self:createFallbackBackground()
    end
end

-- 创建备用背景（当图片加载失败时使用）
function MainMenu:createFallbackBackground()
    -- 创建一个深蓝色的矩形作为备用背景
    local fallbackBg = DrawNode()
    local screenSize = Director.getVisibleSize()
    
    -- 绘制一个覆盖整个屏幕的矩形
    local halfWidth = screenSize.width / 2
    local halfHeight = screenSize.height / 2
    
    fallbackBg:drawRect(
        Vec2(-halfWidth, -halfHeight),
        Vec2(halfWidth, halfHeight),
        Color(0xff0a0a2a)  -- 深蓝色
    )
    
    -- 设置层级
    fallbackBg.zOrder = -100
    
    -- 添加到根节点
    self.rootNode:addChild(fallbackBg)
    print("已创建备用背景")
end

-- 创建按钮
function MainMenu:createButtons()
    -- 创建开始游戏按钮（使用图片）
    self:createImageButton("Image/start.png", Vec2(0, 50), 200, function()
        print("开始游戏按钮被点击")
        -- 直接调用游戏实例的开始游戏方法
        if self.gameInstance then
            self.gameInstance:startGame()
        else
            print("错误：游戏实例未设置")
            -- 备用方案：直接切换场景
            self.sceneManager:switchToScene("MainScene")
        end
    end)
    
    -- 红色按钮：退出游戏
    self:createButton(Color(0xffff0000), Vec2(0, -150), 80, function()
        print("退出游戏按钮被点击")
        Director.terminate()
    end)
end

-- 创建图片按钮辅助函数
function MainMenu:createImageButton(imagePath, position, size, callback)
    -- 创建按钮组节点
    local buttonGroup = Node()
    buttonGroup.position = position
    
    -- 尝试加载按钮图片
    local success, sprite = pcall(function()
        local imgSprite = Sprite(imagePath)
        return imgSprite
    end)
    
    if success then
        -- 图片加载成功
        self.startButtonSprite = sprite
        
        -- 设置图片大小
        if size then
            self.startButtonSprite.size = Size(size, size * 0.5) -- 根据宽高比调整
        end
        
        -- 添加到按钮组
        buttonGroup:addChild(self.startButtonSprite)
        print("开始按钮图片加载成功: " .. imagePath)
    else
        -- 图片加载失败，创建备用按钮
        print("警告：按钮图片加载失败 - " .. tostring(sprite))
        local fallbackButton = DrawNode()
        fallbackButton:drawRect(
            Vec2(-100, -25),
            Vec2(100, 25),
            Color(0xff00ff00)  -- 绿色备用
        )
        
        -- 添加文字标签（如果需要的话）
        -- 这里可以添加文字绘制代码
        
        buttonGroup:addChild(fallbackButton)
        print("已创建备用开始按钮")
    end
    
    -- 创建交互区域
    local buttonInteractive = Node()
    buttonInteractive.size = Size(size * 2, size * 1)  -- 交互区域比图片稍大
    buttonInteractive.position = position
    buttonInteractive.touchEnabled = true
    
    -- 注册点击事件
    buttonInteractive:slot("TapEnded", function()
        print("开始游戏按钮被点击")
        callback()
    end)
    
    -- 鼠标悬停效果
    buttonInteractive:slot("TapBegan", function()
        -- 可以添加按钮按下效果
        if self.startButtonSprite then
            self.startButtonSprite.color = Color(0xddffffff)  -- 稍微变暗
        end
    end)
    
    buttonInteractive:slot("TapCancelled", function()
        -- 恢复原状
        if self.startButtonSprite then
            self.startButtonSprite.color = Color(0xffffffff)
        end
    end)
    
    -- 设置层级，确保按钮在最上层
    buttonInteractive.zOrder = 100
    buttonGroup.zOrder = 100
    
    -- 添加到根节点
    self.rootNode:addChild(buttonInteractive)
    self.rootNode:addChild(buttonGroup)
    
    print("创建图片按钮完成")
end

-- 创建按钮辅助函数（原有的圆形按钮）
function MainMenu:createButton(color, position, size, callback)
    -- 创建按钮背景（圆形）
    local buttonBackground = DrawNode()
    buttonBackground:drawDot(Vec2.zero, size, color)
    
    -- 创建按钮组节点
    local buttonGroup = Node()
    buttonGroup.position = position
    buttonGroup:addChild(buttonBackground)
    
    -- 创建交互区域
    local buttonInteractive = Node()
    buttonInteractive.size = Size(size * 2, size * 2)
    buttonInteractive.position = position
    buttonInteractive.touchEnabled = true
    
    -- 注册点击事件
    buttonInteractive:slot("TapEnded", function()
        print("按钮被点击")
        callback()
    end)
    
    -- 确保按钮在背景之上
    buttonInteractive.zOrder = 100
    buttonGroup.zOrder = 100
    
    -- 添加到根节点
    self.rootNode:addChild(buttonInteractive)
    self.rootNode:addChild(buttonGroup)
    
    print("创建按钮完成")
end

-- 注册输入回调
function MainMenu:registerInputCallbacks()
    -- 确认键：开始游戏
    self.inputManager:onInput("Confirm", function()
        print("确认键按下，开始游戏")
        if self.gameInstance then
            self.gameInstance:startGame()
        else
            self.sceneManager:switchToScene("MainScene")
        end
    end, "UI")
    
    -- 取消键：退出游戏
    self.inputManager:onInput("Cancel", function()
        print("取消键按下，退出游戏")
        Director.terminate()
    end, "UI")
end

-- 清理资源
function MainMenu:cleanup()
    if self.rootNode then
        self.rootNode:removeAllChildren()
    end
    
    -- 清理图片引用
    self.backgroundSprite = nil
    self.startButtonSprite = nil
end

return MainMenu